
package app.beit.fintrack.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import app.beit.fintrack.bean.AccountBean;
import app.beit.fintrack.utils.constr.ConfigConstr;
import app.beit.fintrack.utils.constr.MsgConstr;
import app.beit.fintrack.utils.constr.SessionConstr;
import app.beit.fintrack.ws.dc.AuthenResultDto;
import app.beit.fintrack.ws.dc.MenuDto;
import app.beit.fintrack.ws.dc.UCDCAuthenService;
import app.beit.fintrack.ws.dc.UserDto;
import app.beit.fintrack.ws.dc.client.DCWebserviceClient;
import app.beit.fintrack.ws.iam.AuthenWSRequest;
import app.beit.fintrack.ws.iam.AuthenWSResponse;
import app.beit.fintrack.ws.iam.Authentication;
import app.beit.fintrack.ws.iam.UserInfo;
import app.beit.fintrack.ws.iam.client.IAMWebserviceClient;

@Controller
@RequestMapping("/login")
public class LoginController extends BaseController{
	
	private final Logger log = Logger.getLogger(this.getClass());
	
	@Autowired
	private IAMWebserviceClient authenWs;
	
	@Autowired
	private DCWebserviceClient dcWs;
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="checkuser", method=RequestMethod.POST)
	public @ResponseBody ResponseFintrack<AccountBean> checkUser(final HttpServletRequest request, final @RequestParam("username") String username, 
			final @RequestParam("password") String password, final @RequestParam("domainName") String domainName, final @RequestParam("userType") String userType){
		this.log.info("checkUser with Username : " + username);
		ResponseFintrack<AccountBean> response = null;
		try{
			final AccountBean bean = new AccountBean();
			
			if(userType != null && userType.equalsIgnoreCase("E")){
				final Authentication authen = authenWs.getAuthenticationWebservice();
				final AuthenWSRequest authenRequest = new AuthenWSRequest();
				authenRequest.setDomainName(domainName);
				authenRequest.setUserName(username);
				authenRequest.setPassword(password);
				AuthenWSResponse authenResponse = authen.authen(authenRequest);
				if(authenResponse.getCode().equalsIgnoreCase("IAM00000")){
					response = super.responseSuccess();
					response.setDatas(bean);
					
					final UserInfo user = authenResponse.getUserInfo();
					bean.setFullname(user.getDisplayName());
					bean.setUsername(user.getUserName());
					bean.setUserType("Employee");
					bean.setOfficeName(getNshoName(domainName));
					bean.setDomainName(user.getDomainName());
					request.getSession().setAttribute(SessionConstr.USER, bean);
					request.getSession().setAttribute(SessionConstr.PERMISSION, true);
				}else{
					response = super.responseError(authenResponse.getCode(), authenResponse.getMessage());
				}
				
			}else if(userType != null && userType.equalsIgnoreCase("H")){
				final UCDCAuthenService ucdAuthen = dcWs.getUcdcAuthen();
				AuthenResultDto dcUser = ucdAuthen.getUserWithPermissions(username, password, ConfigConstr.SYSTEM_ID);
				boolean chkPermission = false;
				if(dcUser.getUserDto() != null){
					if(dcUser.getMenus() != null && dcUser.getMenus().size() > 0){
						final List<MenuDto> menus = dcUser.getMenus();
						for(final MenuDto m : menus){
							final String systemId = m.getCategory();
							if(systemId.equalsIgnoreCase(ConfigConstr.SYSTEM_ID)){
								chkPermission = true;
								break;
							}
						}
						
						if(!chkPermission){
							return super.responseError("", MsgConstr.DC_ERROR_LOGIN_PERMISSION_MSG);
						}
					}
					
					final UserDto user = dcUser.getUserDto();
					if(!user.getFromType().equalsIgnoreCase("H")){
						return super.responseError("", MsgConstr.DC_ERROR_LOGIN_TYPE_MSG);
					}
					response = super.responseSuccess();
					response.setDatas(bean);
					bean.setFullname(dcUser.getUserDto().getFname()+" "+dcUser.getUserDto().getLname());
					bean.setUsername(dcUser.getUserDto().getLoginId());
					bean.setUserType("Hospital");
					bean.setOfficeCode(dcUser.getUserDto().getOrgId());
					bean.setOfficeName(dcUser.getUserDto().getOrgName());
					request.getSession().setAttribute(SessionConstr.USER, bean);
					request.getSession().setAttribute(SessionConstr.PERMISSION, chkPermission);
				}else{
					response = super.responseError(MsgConstr.DC_ERROR_LOGIN_CODE, dcUser.getErrorMessage());
				}
			}
			this.log.info("checkUser success.....");
		}catch(Exception e){
			this.log.error(e.getMessage());
			e.printStackTrace();
			response = super.responseError(MsgConstr.ERROR_EXCEPTION_CODE, e.getMessage());
		}
		
		return response;
	}
	
	@RequestMapping(value="logout")
	public String logOut(final HttpServletRequest request){
		this.log.info("take in logout.....");
		super.removeAllSessionAttributes(request);
//		final String contextPath = request.getContextPath();
//		this.log.info("show contextPath : "+contextPath);
		return "redirect:/";
	}
	
	
	private static String getNshoName(final String domainName){
		String nshoName = "";
		switch (domainName) {
		case "nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ ส่วนกลาง";
			break;
		case "cmi.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 01 เชียงใหม่";
			break;
		case "plk.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 02 พิษณุโลก";
			break;
		case "nkw.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 03 นครสวรรค์";
			break;
		case "srr.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 04 สระบุรี";
			break;
		case "rbr.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 05 ราชบุรี";
			break;
		case "ryg.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 06 ระยอง";
			break;
		case "kkn.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 07 ขอนแก่น";
			break;
		case "udt.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 08 อุดรธานี";
			break;
		case "nkm.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 09 นครราชสีมา";
			break;
		case "ubn.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 10 อุบลราชธานี";
			break;
		case "srn.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 11 สุราษฎร์ธานี";
			break;
		case "skl.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 12 สงขลา";
			break;
		case "bk.nhso.go.th":
			nshoName = "สำนักงานหลักประกันสุขภาพแห่งชาติ เขต 13 กรุงเทพมหานคร";
			break;
		}
		return nshoName;
	} 
	
}
